<?php
/**
 * 登陆过程中完成以下事项：
 *	1、验证、保存token，如果是新用户就注册，刷新该用户其他社交账号的token并保存；
 *	2、生成session
 *	3、生成salt，记录cookie为了下次自动登录；
 *	4、如果是新用户，记录cookie[is_new_user]；## 暂时不用了，由于更改了界面，所以没法显示mask的新手导航了 ####################
 *	5、如果用户没有使用extension保存过文章，那么记录cookie[is_show_extension_tip]
 *	6、发布event，更新好友名单
 *	7、最后返回的为uid
 *		session['user_id]：		当登陆成功后，创建
 *		cookie[is_new_user]：		## 暂时不用了，同上  ### 注册的新用户，或者是已经激活的用户的未登录过的好友进行的第一次登陆（用salt来判断）也同样认为是新用户，创建
 *		cookie[is_show_extension_tip]：	显示提示extension，没有使用extension保存过文章（检索circle article）时，创建
 * 
 * token登陆：
 *	1、用token中的uid来查询数据库中的用户信息，如果不存在则创建，返回user info
 *	2、保存当前token
 *	3、生成salt，自动登录的cookie、session
 *	4、检查该用户其他社交账号的token情况，刷新并保存
 *	5、返回uid
 * cookie登陆：
 *	1、cookie to userinfo
 *	2、检查每一个社交账号的token，刷新并保存
 *	3、生成salt，自动登录的cookie、session
 *	4、返回uid
 * 腾讯微博openkey站内登陆（注：这里只是为了腾讯微博站内页面app_qqwb.php的访问，当真正点击阅读时，将重新进入callback来使用token登陆）
 *	1、openkey to userinfo or register
 *	2、返回uid
 * 
 * 
 * @version 7
 * @author Leon
 *
 */
class data_login extends data {
	public function __construct() {
		parent::__construct();
	}
	/**
	 * 检查token中的social id是否已经注册，否则就注册新用户。成功之后save token，Event(update friends) ，update salt，create cookie and session
	 * 
	 * @param String $type		// social type
	 * @param Array $token	// (uid, access_token, refresh_token, ctime, expires_in, name, nick)
	 * @return int			// uid
	 */
	public function login_by_token ($type, $token) {
		if ($type and $token) {
			$data_user = new data_user();
			$user = $data_user->one_by_social_id($type, $token['uid']);
			if ($user) {								// 已经是注册用户，或者是某用户的好友
				$data_social = new data_social();
				$data_social->save_token($type, $token);								// 1、保存token
				if ($this->update_cookie($user['id'])) {								// 2、生成session、salt、cookie[ureadmea]
//					if (!preg_match('/^[0-9|a-f]{32}$/i', $user['salt'])) {
//						setcookie('is_new_user', 1, time()+(3600*24*30), '/', '.uread.me');		// 3、cookie新用户
//					}
					if ($data_user->is_show_extension_tip($user['id'])) {
						setcookie('is_show_extension_tip', 1, time()+(3600*24*365), '/', '.uread.me');	// 4、cookie extension
					} elseif ($_COOKIE['is_show_extension_tip']) {
						setcookie('is_show_extension_tip', '', -1, '/', '.uread.me');
					}
					$this->check_token_or_refresh($user, $type);						// 5、检查其他的社交账号，有必要的话就刷新并存入数据库
					new data_event('update_friends', array ( 'user_id' => $user['id']), 'high');	// 6、发布Event:更新好友清单
					return $user['id'];											// 7、登陆成功
				} 
			} else {								// 新用户
				new data_error_devel('callback来了个新用户，下面尝试创建新用户，如果没有报错，那就是成功了', array('type'=>$type, 'token'=>$token), __CLASS__, __FUNCTION__, __LINE__);
				$uid = $data_user->add_user_by_social_id($type, $token['uid'], $token['nick'], $token['name']);
				if ($uid) {
					$data_social = new data_social();
					$data_social->save_token($type, $token);							// 1、保存token
					if ($this->update_cookie($uid)) {								// 2、生成session、salt、cookie[ureadmea]
//						setcookie('is_new_user', 1, time()+(3600*24*30), '/', '.uread.me');		// 3、cookie新用户
						setcookie('is_show_extension_tip', 1, time()+(3600*24*365), '/', '.uread.me');	// 4、cookie extension
																		// 5、新用户不用检查其他社交账号了
						new data_event('update_friends', array ( 'user_id' => $uid), 'high');	// 6、发布Event:更新好友清单
						return $uid;											// 7、登陆成功
					}
				} else 	new data_error_devel('注册新用户失败', array('type'=>$type, 'token'=>$token), __CLASS__, __FUNCTION__, __LINE__);
			}
		} else 	new data_error_devel('callback token错误', array('type'=>$type, 'token'=>$token), __CLASS__, __FUNCTION__, __LINE__);
		$this->clear_all();
		return false;
	}
	/**
	 * 检查session， 如果没有的话，则使用cookie登陆
	 * 
	 * @return Int
	 */
	public function login_by_cookie() {
		if ($_SESSION ['user_id']) {
			return $_SESSION ['user_id'];
		} else {						// 尝试用cookie登陆
			$user = $this->parse_cookie();	// 解析登陆cookie，返回userinfo
			if ($this->check_token_or_refresh($user)) {								// 1、检查每一个社交账号，刷新，保存token
				if ($this->update_cookie($user['id'])) {								// 2、生成session、salt、cookie[ureadmea]
																		// 3、cookie新用户，肯定不是新用户
					$data_user = new data_user();
					if ($data_user->is_show_extension_tip($user['id'])) {
						setcookie('is_show_extension_tip', 1, time()+(3600*24*365), '/', '.uread.me');	// 4、cookie extension
					} elseif ($_COOKIE['is_show_extension_tip']) {
						setcookie('is_show_extension_tip', '', -1, '/', '.uread.me');
					}
																		// 5、其他社交账号已经在第1步中完成
					new data_event('update_friends', array ('user_id' => $user['id']), 'high');		// 6、发布Event:更新好友清单
					return $user['id'];											// 7、登陆成功
				}
			}
		}
		$this->clear_all();
		return false;
	}
	/**
	 * 在腾讯微博站内应用中，只能使用openkey登陆
	 * 
	 * @param type $qqwb_id
	 * @param type $openkey
	 * @return Int
	 */
	public function login_by_qqwb_openkey ($qqwb_id, $openkey) {
		if ($qqwb_id and $openkey) {
			$data_qqwb = new data_qqwb();
			$user_info = $data_qqwb->get_user_info_by_openkey($qqwb_id, $openkey);		// array(qqwb_id, nick, name);
			if ($user_info) {
				$data_user = new data_user();
				$uid = $data_user->social_id_to_uid('qqwb', $user_info['qqwb_id']);
				if ($uid) {
					return $uid;
				} else {
					$uid = $data_user->add_user_by_social_id('qqwb', $user_info['qqwb_id'], $user_info['nick'], $user_info['name']);
					if ($uid) {
						// 创建新用户成功
//						setcookie('is_new_user', 1, time()+36000, '/', '.uread.me');		// 标记新用户
						return $uid;
					} else {
						new data_error_devel('QQ微博站内app来了新用户，可是注册新用户错误', array ('qqwb_id'=>$qqwb_id, 'openkey'=>$openkey, 'user_info'=>$user_info), __CLASS__, __FUNCTION__, __LINE__);
					}
				}
			}

		}
		$this->clear_all();
		return false;
	}
	public function logout() {
		if ($_GET ['logout']) {
			$this->clear_all ();
			unset ( $_GET ['logout'] );
			header ( 'Location:' . $_SERVER ['PHP_SELF'] . (($_GET) ? '?' . http_build_query ( $_GET ) : '') );
			die (); // 输出后终止
		}
	}
	private function check_token_or_refresh ($user, $by_pass_type='') {
		$is_login = false;
		// 检查微博token
		if ($by_pass_type == 'weibo') {
			$is_login = true;
		} elseif ($user['weibo_id']) {
			$data_weibo = new data_weibo();
			if ($data_weibo->token_valid_or_refresh_into_db($user['weibo_token'])) {
				$is_login = true;
			}
		}
		// 检查人人 token
		if ($by_pass_type == 'renren') {
			$is_login = true;
		} elseif ($user['renren_id']) {
			$data_renren = new data_renren();
			if ($data_renren->token_valid_or_refresh_into_db($user['renren_token'])) {
				$is_login = true;
			}
		}
		// 检查kaixin001 token
		if ($by_pass_type == 'kaixin001') {
			$is_login = true;
		} elseif ($user['kaixin001_id']) {
			$data_kaixin001 = new data_kaixin001();
			if ($data_kaixin001->token_valid_or_refresh_into_db($user['kaixin001_token'])) {
				$is_login = true;
			}
		}
		// 检查qqwb token
		if ($by_pass_type == 'qqwb') {
			$is_login = true;
		} elseif ($user['qqwb_id']) {
			$data_qqwb = new data_qqwb();
			if ($data_qqwb->token_valid_or_refresh_into_db($user['qqwb_token'])) {
				$is_login = true;
			}
		}
		return $is_login;
	}	
	private function create_cookie ($uid=0, $salt='') {
		if ($uid and $salt) {
			$hash = md5($uid.$salt.'ureadme');
			$cookie = $uid."_".md5($uid.$hash.'ureadme').$hash;
			setcookie('ureadmea', $cookie, (time() + 60*60*24*30), '/', '.uread.me', false, true);
		}
	}
	private function clear_cookie () {
		setcookie('ureadmea',		'', -1, '/', '.uread.me', false, true);
//		setcookie('is_new_user',		'', -1, '/', '.uread.me', false, true);
		setcookie('is_show_extension_tip',	'', -1, '/', '.uread.me', false, true);
	}
	private function update_cookie ($uid) {
		$uid = intval($uid);
		
		if ($uid) {
			$new_salt = md5(microtime());
			$update = $this->db->execute('
				update
					users
				set
					salt = "'.$new_salt.'"
				where
					id = "'.$uid.'"
			');
			if ($update) {										// 更新salt，更新cookie，创建session登陆
				$this->create_cookie($uid, $new_salt);
				$this->create_session($uid);
				return true;
			} else return false;
		} else return false;
	}
	private function parse_cookie () {
		if ($_COOKIE['ureadmea']) {
			$explode = explode('_', $_COOKIE['ureadmea']);
			$uid = intval($explode[0]);
			$verify = substr($explode[1], 0, 32);
			$hash = substr($explode[1], 32, 32);
			if ($uid and $verify and $hash and $verify == md5($uid.$hash.'ureadme')) {
				$data_user = new data_user();
				$user = $data_user->one($uid);
				if ($user) {
					if ($hash == md5($user['id'] . $user['salt'] . 'ureadme')) {
						// 返回用户详情
						return $user;
					}
				}
			}
			// 清除cookie
			$this->clear_cookie();
			return false;
		} else return false;
	}
	private function create_session($uid) {
		$_SESSION ['user_id'] = intval ( $uid );
		return true;
	}
	public function clear_all() {
		unset($_SESSION['user_id']);
		$this->clear_cookie();
		return true;
	}
}
?>